package main

import "fmt"

/**
 *  Go语言基础语法
 *  2.1：变量定义
 *  1.使用var关键字
 *	(1) var a, b, c bool
 *	(2) var s1, s2 string = "hello", "world"
 *	(3) 可放在函数内，或直接放在包内
 *	(4) 使用var()集中定义变量
 *  2.让编译器自动决定类型
 *  (1) var a, b, i, s1,s2 = true, false,3, "hello", "world"
 *  3.使用:=定义变量
 *  (1) a, b, i,s1, s2 := true, false, 3, "hello", "world"
 *  (2) 只能在函数内使用
 *
 *
 */
func main() {
	fmt.Println("hello world")
	variableZeroValue()
	variableInitialValue()
	variableTypeDeduction()
	variableShorter()
	fmt.Println(aa, ss, bb)
	fmt.Println(aaa, sss, bbb)
}

// 1.不赋值情况下，变量存在初值
func variableZeroValue() {
	var a int
	var s string
	fmt.Println(a, s)           // Println只能跟名字
	fmt.Printf("%d %q\n", a, s) // Printf可以跟格式
}

// 2.变量赋值初值
func variableInitialValue() {
	// go语言（要求严格）定义的变量必须使用，不然报错
	var a, b int = 3, 4
	var s string = "abc"
	fmt.Println(a, b, s)
}

// 3.省略类型，可以通过类型推断出该变量类型
func variableTypeDeduction() {
	var a, b, c, s = 3, 4, true, "def"
	fmt.Println(a, b, c, s)
}

// 4.比3更简单的写法，省略var 使用 ： , 第二次赋值不能使用 :
func variableShorter() {
	a, b, c, s := 3, 4, true, "def"
	b = 5
	fmt.Println(a, b, c, s)
}

// 5.在函数外定义变量,在函数外面不能使用 : 定义变量 比如 bb := true, 必须使用关键字类似于var之类的
// 不是全局变量，是包内部变量，go语言没有全局变量的说法
var aa = 3
var ss = "kkk"
var bb = true

// 6.简写5,可以使用括号
var (
	aaa = 3
	sss = "kkk"
	bbb = true
)
